package sy3_design_principle.demeter;
/**
 * Demeter法则的目的是：降低类之间的耦合度、提高模块的相对独立性。
 * 每个模块只和自己的朋友说话，不与陌生人说话。
 * 如果两个软件实体无须直接通信，那么就不应当发生直接的相互调用，可以通过第三方转发该调用。
 * 迪米特法则中的"朋友"与当前对象存在关联、聚合或组合关系，当前对象可以访问朋友对象的方法。朋友包括：
 * 当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等。
 *
 * 考虑明星与经纪人的关系实例。明星全身心投入艺术，许多日常事务由经纪人负责处理，如和粉丝的见面会，和媒体公司的业务洽淡等。
 * 经纪人是明星的朋友，粉丝和媒体公司是明星的陌生人。
 *
 * 不与陌生人说话，即是说在类的内部，不应有以局部变量形式出现的陌生类。
 */
class Star{    //明星类
    private String name;

    public Star(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
class Fans{   //粉丝类
    private String name;

    public Fans(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
class Company{  //媒体公司类
    private String name;

    public Company(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

class Agent{   //经纪人类
    private Star star;
    private Fans fans;
    private Company company;

    public void setStar(Star star) {
        this.star = star;
    }

    public void setFans(Fans fans) {
        this.fans = fans;
    }

    public void setCompany(Company company) {
        this.company = company;
    }

    public void meeting(){  //和粉丝见面的方法
        System.out.println(star.getName()+"和粉丝"+fans.getName()+"见面");
    }

    public void business(){  //和媒体公司见面的方法
        System.out.println(star.getName()+"和"+company.getName()+"洽谈");
    }

}
public class Client {
    public static void main(String[] args) {
        //创建经纪人类对象
        Agent agent = new Agent();
        //创建明星对象
        Star star = new Star("刘德华");
        agent.setStar(star);
        //创建粉丝对象
        Fans fans = new Fans("李小明");
        agent.setFans(fans);
        //创建媒体公司对象
        Company company = new Company("黑马媒体公司");
        agent.setCompany(company);

        agent.meeting();//和粉丝见面
        agent.business();//和媒体公司洽谈业务
    }
}
